package net.bitacademy.java22.service;

//Timer에 의해 주기적으로 불려지는 thread

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.bitacademy.java22.domain.AccessTokenDAO;
import net.bitacademy.java22.domain.AccessTokenVO;
import net.bitacademy.java22.domain.EventDAO;
import net.bitacademy.java22.domain.EventVO;
import android.util.Log;

import com.google.api.services.calendar.model.Event;
import com.google.api.services.calendar.model.Events;

public class EventImportor extends Thread{
	Trigger mParent;
	GoogleCalendarAdapter instance = GoogleCalendarAdapter.getInstance();
	static long a;
	public EventImportor(Trigger parent) {
		mParent = parent;
	}
	
	private void callGoogleCalendarAdapter() throws Exception {
		
		AccessTokenVO acessTokenVO;
		AccessTokenDAO accessTokenDAO = new AccessTokenDAO(mParent);
		
		accessTokenDAO.select();
		AccessTokenVO atvo = AccessTokenVO.getInstance();
		
		a = (System.currentTimeMillis()-atvo.getCurrentTime())/(1000*60); 
		
		
		if(a<60){
			Log.v("validate", "50");
			Log.v("validate", Long.toString(System.currentTimeMillis()));
			eventList();
			accessTokenDAO.updateCurrentTime();
//		}else if(a<60){
//			Log.v("validate", "In 60");
//			acessTokenVO=instance.refresh();
//			accessTokenDAO.insert(acessTokenVO);
//			eventList();
		}else{
			ProfileHandler ph = new ProfileHandler(mParent);
			//mQuit = false;
			accessTokenDAO.delete1();
			ph.triggerStop();
			//MainTest m = new MainTest();
			//m.onCreate(savedInstanceState);
		}
	}


	private void eventList() throws Exception{
			//EventDAO을 받아서 for문 안에서 사용하기 위해 위에 선언
			EventDAO eventDAO = new EventDAO(mParent);
			
			Log.d("callGoogleCalendarAdapter", "in callGoogleCalendarAdapter");
			
			//먼저 DAO의 delete()를 불러서 테이블을 지운다.	
			if(eventDAO.exist()){				
				eventDAO.delete();
			}
			instance.getToken();
			instance.getService();				
			Events events = instance.getEvents();
			while(true){
				for (Event event : events.getItems()) {
					Log.d("callGoogleCalendarAdapter", event.getSummary());		
					//DAO의 delete()된 테이블에 insert를 한다.
					//단, parsing에서 null값을 리턴했을 경우 DAO에 넣지 않도록 if문을 돌린다.
					if(parseEvent(event)!=null)
						eventDAO.insert(parseEvent(event));
					} break;
			}
		
	}

	//event를 가지고 와서 태그가 있으면 vo로 보냄
	private EventVO parseEvent(Event event) {
		EventVO eventVO = new EventVO();
		String result = regularExpression(event.getSummary() + " " + event.getLocation());
		if(result == null)
			return null;
		eventVO.setTitle(event.getSummary());
		eventVO.setId(event.getId());
		eventVO.setStart(event.getStart().toString());
		eventVO.setEnd(event.getEnd().toString());
		eventVO.setTag(result);
		
		return eventVO;

	}
	
	// 작성자 : 이현우
	// 내용 : 정규식으로 태그값(@미팅) 등을 분리해주는 메소드.
	//		@을 제외한 특수문자가 들어온경우 null을 반환한다.
	// 마지막 업데이트 날짜 : 2012-3-6
	private String regularExpression(String search) {
		Pattern p =Pattern.compile("[^\uAC00-\uD7A3xfe@0-9a-zA-Z\\s]");
		Pattern p2=Pattern.compile("@[a-z|A-Z|ㄱ-ㅎㅏ-ㅣ가-힣|0-9]*");
		Matcher m =p.matcher(search);
		Matcher m2=p2.matcher(search);
		if(m.find())
			return null;
		else if(m2.find()) {
			String op1= m2.group().substring(m2.group().indexOf('@')+1);
			return op1;
		}
		return null;
	}
	
	private void saveEventDAO(EventVO evo) {
//		EventDAO eventDAO = new  EventDAO(mParent);
//		eventDAO.insert(evo);
//		eventDAO.delete();
	}
	
	public void run() {
		while(Trigger.run) {
			try {
				callGoogleCalendarAdapter();
			} catch (Exception e1) {
				e1.printStackTrace();
			}
			try { Thread.sleep(10000);} catch (Exception e) { ; }
		}
	}
}
